package JVM;

/**
 * @author shy_black
 * @date 2019/7/30 11:59
 * @Description:
 *
 * jdk1.6:intern()会把首次遇到的字符串实例复制到永久代中，返回的也是永久代中这个字符串的实例，
 *      而StringBuilder创建的字符串实例在java堆上，所以不是同一个引用，返回false
 * jdk1.7:intern()不在复制实例，只在常量池中记录首次出现的实例引用，因此，intern()返回的引用和stringbuilder创建的
 *      那个字符串实例是同一个，
 *          对str2比较返回的false是应为“java”这个字符串在执行StringBuilder.toStirng()之前已经出现过，字符串常量池中
 *          已经有它的引用了，不符合首次出现的原则，
 *
 *          而“计算机软件”这个字符串首次出现，因此返回true。
 */
public class 字符串常量池Test {
    public static void main(String[] args) {

        //String str2 = new StringBuilder("ja").append("va").toString();
        //问题在StringBulider 和String中追加字符的区别上
        String str2 = "ja" + "va";
        String str3 = str2.intern();
        System.out.println("输出hashcode =="+ str3.hashCode()+"\t" +str2.hashCode());
        System.out.print("hashcode是否相等---"+"" );
        System.out.println(str3.hashCode() == str2.hashCode());
        System.out.println("俩值是否相等"+str3.equals(str2));
        System.out.println(str3 == str2);




//        String str1 = new StringBuilder("计算机").append("软件").toString();
//        System.out.println(str1.intern() == str1);



//
//        String str3 = new String("str") + new String ("01");
//        System.out.println(str3.intern() == str3);
//
//        String str4 = new StringBuilder("c").append("++").toString();
//        System.out.println(str4.intern() == str4);

//
//        String str8 = "str" + "07";
//        str8.intern();
//        String str7 = "str07";
//        System.out.println(str7 == str8);
//
//
//
//
//        String str5 = "str05";
//        String str6 = "str" + "05";
//        str6.intern();
//        System.out.println(str5 == str6);


    }
}
